#include "RCPWM.h"

int RCPWM[10] = {0,0,0,0,0,0,0,0,0,0};//RCPWM的数据数组，所有飞控的输出数据直接放这个数组就可以了
uint8_t chNum[10] = {pwmPin1, pwmPin2, pwmPin3, pwmPin4, pwmPin5, pwmPin6, pwmPin7, pwmPin8, pwmPin9, pwmPin10};
uint8_t n = 8;//索引号

void INIT_SERVO()
{//初始化servo信号
  //首先定义各端口输出
  pinMode(pwmPin1, OUTPUT);
  pinMode(pwmPin2, OUTPUT);
  pinMode(pwmPin3, OUTPUT);
  pinMode(pwmPin4, OUTPUT);
  pinMode(pwmPin5, OUTPUT);
  pinMode(pwmPin6, OUTPUT);
  pinMode(pwmPin7, OUTPUT);
  pinMode(pwmPin8, OUTPUT);
  pinMode(pwmPin9, OUTPUT);
  pinMode(pwmPin10, OUTPUT);

  /*其次把定时器1打开，定时器1采用的是
    普通模式，溢出上限是0xFFFF，8分频。
    不能通过修改上限来改变周期，但是可
    以超调定时器的计数器TCNT1，让定时
    器1跃迁到需要的起始点上，实现周期
    的缩短。
  */
  TCCR1A = 0;//普通模式，事件A、B端口不连
  TCCR1B = 0b10;//普通模式，8分频，溢出上限0xFFFF，PWM的分辨率为0.5μs
  TCCR1C = 0;
  TCNT1 = 57535;//超调TCNT1至57535，这样一周期为4000
  OCR1A = 57535 + 3000;//事件A默认在1500的位置上
  OCR1B = 57535 + 3000;//事件B默认在1500的位置上
  TIMSK1 = 0b111;//打开比较器A、B和溢出事件
  sei();//打开全局中断
}

ISR(TIMER1_OVF_vect)
{//溢出事件，可以看作为起始事件
  n += 2;
  if (n >= 10)
  {
    n = 0;
  }
  TCNT1 = 57535;//超调TCNT1达到50Hz频率需要的周期
  digitalWrite(chNum[n], HIGH);
  digitalWrite(chNum[n + 1], HIGH);
  OCR1A = RCPWM[n] * 2 + 57535;//比较器A设定目标
  OCR1B = RCPWM[n + 1] * 2 + 57535;//比较器B设定目标
}

ISR(TIMER1_COMPA_vect)
{//比较器A事件，查看的是奇数数组号
  digitalWrite(chNum[n], LOW);
}

ISR(TIMER1_COMPB_vect)
{//比较器B事件，与A相同，查看的是偶数数组号
  digitalWrite(chNum[n + 1], LOW);
}
